﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using BusinessLogicLayer;
using DataAccessComponents;
using System.Collections.ObjectModel;

namespace inzDesktop
{
    /// <summary>
    /// Interaction logic for windowSzczegolyOferta.xaml
    /// </summary>
    public partial class windowSzczegolyOferta : Window
    {
        private ObservableCollection<Termin> terminyDoUsuniecia = new ObservableCollection<Termin>();
        public windowSzczegolyOferta()
        {
            InitializeComponent();
            uzupelnijComboBox();
        }

        public void inicjalizujZawartosc(int idoferta)
        {
            OfertaBL ofertaBL = new OfertaBL();
            Oferta oferta = ofertaBL.pobierz(idoferta);            
            oferta.Czy_zmiana = false;
            this.DataContext = oferta;

            // Zmiana tytułu okna
            this.Title = string.Format("Szczegóły oferty {0}", oferta.Nazwa);
            
        }

        private void uzupelnijComboBox()
        {
            // Kategorie
            KategoriaBL kategoriaBL = new KategoriaBL();
            cbKategoria.ItemsSource = kategoriaBL.pobierzListe();

            // Linie lotnicze
            LinieLotniczeBL linielotniczeBL = new LinieLotniczeBL();
            cbNazwaLinieLotnicze.ItemsSource = linielotniczeBL.pobierzListe();
            

            // Hotele
            HotelBL hotelBL = new HotelBL();
            cbNazwaHotel.ItemsSource = hotelBL.pobierzListe();

            // Miasta
            MiastoBL miastoBL = new MiastoBL();
            cbNazwaMiasto.ItemsSource = miastoBL.pobierzListe();

            // Kraje
            KrajBL krajeBL = new KrajBL();
            cbNazwaKraj.ItemsSource = krajeBL.pobierzListe();

            // Typ pokoju
            string[] typ = { "Pokój dwuosobowy", "Pokój dwuosobowy z dostawką", "Pokój jednoosobowy", "Pokój rodzinny dla 3 osób", "Pokój rodzinny dla 4 osób" };
            cbTypPokoju.ItemsSource = typ;
        }

        /// <summary>
        /// Gdy uzytkownik wybierze hotel aktulizowane są informacje o miescie i kraju
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cbNazwaHotel_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            // Pobieranie zaznaczonego hotelu
            Hotel hotel = cbNazwaHotel.SelectedItem as Hotel;

            // Aktualizacjia Miasta i Kraju
            cbNazwaMiasto.SelectedValue = hotel.Id_miasta;
            cbNazwaMiasto.SelectedValuePath = "Id_miasta";

            cbNazwaKraj.SelectedValue = hotel.Miasto.Id_kraju;
            cbNazwaKraj.SelectedValuePath = "Id_kraju";


        }

        private void btnZmien_Click(object sender, RoutedEventArgs e)
        {
            windowZmienHotel wzh = new windowZmienHotel();
            wzh.ShowDialog();

            if (wzh.DialogResult.Value == true)
            {
                foreach (Hotel hotel in cbNazwaHotel.Items)
                {
                    // Zaznaczenie wybranego hotelu w combobox
                    if (hotel.Id_hotelu == wzh.Id_hotelu)
                    {
                        cbNazwaHotel.SelectedItem = hotel;
                    }
                }
            }

        }

        private void dataGridListaTerminowOferta_Loaded(object sender, RoutedEventArgs e)
        {
            inicjalizujDataGrid();
            
        }

        private void inicjalizujDataGrid()
        {
            
            TerminBL terminBL = new TerminBL();
            Oferta oferta = this.DataContext as Oferta;                        

            // Dodawanie widoku do kontrolki od filtrowania
            filtrTerminy.Widok = CollectionViewSource.GetDefaultView(terminBL.pobierzListe(oferta.Id_oferta));
            dataGridListaTerminowOferta.ItemsSource = filtrTerminy.Widok;

            // Przekazywanie nazw kolumn
            filtrTerminy.cbNazwaColumny.ItemsSource = new String[] { "ID", "Oferta", "Ilość dni" };
            // Dodawanie filtru            
            filtrTerminy.Filtr = new Predicate<object>(filtrTerminy.filtrListaTerminow);
        }

        private void buttonSzczegoly_Click(object sender, RoutedEventArgs e)
        {
            Termin termin = dataGridListaTerminowOferta.SelectedItem as Termin;
            windowSzczegolyTermin wst = new windowSzczegolyTermin();
            wst.inicjalizujZawartosc(termin.Id_termin);
            wst.ShowDialog();
        }

        private void buttonUsun_Click(object sender, RoutedEventArgs e)
        {
            Termin termin = dataGridListaTerminowOferta.SelectedItem as Termin;
            terminyDoUsuniecia.Add(termin);
            
            // Usuniecie z dataGrid
            ObservableCollection<Termin> terminy = dataGridListaTerminowOferta.ItemsSource as ObservableCollection<Termin>;
            terminy.Remove(termin);
            dataGridListaTerminowOferta.ItemsSource = terminy;
        }

        private void btnOk_Click(object sender, RoutedEventArgs e)
        {
            if (Validacja.IsValid(this.LayoutRoot))
            {
                if (((Oferta)this.DataContext).Czy_zmiana == true)
                {
                    System.Windows.MessageBoxResult wynik = System.Windows.MessageBox.Show("Czy zapisać zmiany?", "Uwaga!", MessageBoxButton.YesNoCancel, MessageBoxImage.Question);
                    if (wynik == MessageBoxResult.Yes)
                    {
                        zapiszZmianyOferta();
                        zapiszZmianyTermin();
                        this.Close();
                    }
                    else if (wynik == MessageBoxResult.No)
                    {
                        this.Close();
                    }
                }
                else
                    this.Close();
            }
            else
            {
                MessageBox.Show("Wprowadzone zostały niepoprawne dane.", "Błąd", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void zapiszZmianyOferta()
        {
            OfertaBL ofertaBL = new OfertaBL();
            ofertaBL.aktualizuj(this.DataContext as Oferta);
        }

        private void zapiszZmianyTermin()
        {
            TerminBL terminBL = new TerminBL();
            terminBL.usun(terminyDoUsuniecia);
        }

        private void btnZastosuj_Click(object sender, RoutedEventArgs e)
        {
            if (Validacja.IsValid(LayoutRoot))
            {
                zapiszZmianyOferta();
                zapiszZmianyTermin();
                System.Windows.MessageBox.Show("Zmiany zapisane pomyślnie", "Sukces", MessageBoxButton.OK, MessageBoxImage.Information);
            }
            else
            {
                MessageBox.Show("Wprowadzone zostały niepoprawne dane.", "Błąd", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        
        }

        private void btnAnuluj_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void btnDodaj_Click(object sender, RoutedEventArgs e)
        {
            windowDodajTermin wdt = new windowDodajTermin();
            // Tworzenie obiektu tymczasowego, aby przekazać go do okna dodawania terminu
            Termin termin = new Termin();
            termin.Id_oferta = (this.DataContext as Oferta).Id_oferta;

            wdt.inicjalizujZawartosc(termin);
            wdt.ShowDialog();
            this.inicjalizujDataGrid();

        }       

        


       
        ///// <summary>
        ///// Gdy uzytkownik wybierze kraj to hotele i miasta są wyswietlane wg tego kraju
        ///// </summary>
        ///// <param name="sender"></param>
        ///// <param name="e"></param>
        //private void cbNazwaKraj_SelectionChanged(object sender, SelectionChangedEventArgs e)
        //{
        //    if (cbNazwaKraj.SelectedItem != null)
        //    {
        //        MiastoBL miastoBL = new MiastoBL();
        //        Kraj kraj = cbNazwaKraj.SelectedItem as Kraj;
        //        cbNazwaMiasto.ItemsSource = miastoBL.pobierzListe(kraj.Id_kraju);
        //        cbNazwaMiasto.SelectedIndex = 0;
        //    }
        //}

        ///// <summary>
        ///// Gdy uzytkownik wybierze miasto to hotele są wyswietlane wg tego miasta
        ///// </summary>
        ///// <param name="sender"></param>
        ///// <param name="e"></param>
        //private void cbNazwaMiasto_SelectionChanged(object sender, SelectionChangedEventArgs e)
        //{
        //    if (cbNazwaMiasto.SelectedItem != null)
        //    {
        //        HotelBL hotelBL = new HotelBL();
        //        Miasto miasto = cbNazwaMiasto.SelectedItem as Miasto;
        //        cbNazwaHotel.ItemsSource = hotelBL.pobierzListe(miasto.Id_miasta);
        //        cbNazwaHotel.SelectedIndex = 0;
        //    }
        //}
    }
}
